package modelo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;

public class Conexion 
{
     private static String driver="org.postgresql.Driver";
     private static String nombreBD="BD2-2";
     private static String url="jdbc:postgresql://localhost:5432/";    
     private static String usuario="postgres";
     private static String password="postgres";
     private static Connection conexion;
     
     private static Connection getConexion() throws Exception
     {
    	 try
    	 {
    	   if (conexion==null || conexion.isClosed())
    	   {
    		  Class.forName(driver);
    		  conexion= DriverManager.getConnection(url + nombreBD,usuario,password);
    	   }
    	 }
    	 catch(SQLException e)
    	 {
    		 throw new Exception("Error Conectando con la Base de Datos");
    	 }
    	 catch(ClassNotFoundException e)
    	 {
    		 throw new Exception("Error Cargando Driver de Gestor Base de Datos");
    	 }
    	 
    	 return conexion;
     }
     
     public static ResultSet ejecutarDQL(String tiraSQL) throws Exception
     {
    	 ResultSet rs= null;
         try
         {
        	 getConexion(); 
        	 Statement st= conexion.createStatement();
        	 rs= st.executeQuery(tiraSQL);
        	 
        	 
        	 conexion.close();
         }
         catch(SQLException e)
         {
        	 throw new Exception("Error Ejecutando Consulta SQL");
         }
         catch(Exception e)
         {
        	 throw e;
         }
    	 return rs;
     }
     
     public static boolean ejecutarDML(String tiraSQL) throws Exception
     {
        boolean ok= false;
        
        try
        {
        	getConexion();
        	Statement st= conexion.createStatement();
        	
        	if (st.executeUpdate(tiraSQL) > 0)
        		ok=true;
        	
        	conexion.close();
        }
        catch(SQLException e)
        {
        	throw new Exception("Error Ejecutando Actualizacion en la Base de Datos");
        }
        catch(Exception e)
        {
        	throw e;
        }
        
        return ok;
     }
     
     public static boolean ejecutarDMLTransaccion(List<String> tirasSQL) throws Exception
     {
    	 boolean ok=true;
    	 try
    	 {
    		 getConexion();
    		 
    		 conexion.setAutoCommit(false); //Deshabilita El autocommit
    		 Statement st= conexion.createStatement();
    		 
    		 for (String cadenaSQL:tirasSQL)
    		 {
    			if (st.executeUpdate(cadenaSQL) < 1)
    			{
    				ok= false;
    				break;
    			}		
    		 }
    		 
    		 if (ok)
    			 conexion.commit(); //Se ejecutan la transaccion
    		 else
    			 conexion.rollback(); //Se devuelve la base de datos a su estado original
    		 
    		 conexion.setAutoCommit(true);
    		 conexion.close();
    	 }
    	 catch(SQLException e)
    	 {
    		 if (conexion!=null && !conexion.isClosed())
    		 {		 
    			 conexion.rollback();
    		 }
    		 throw new Exception("Error en Transaccion");
    		 
    	 }
    	 catch(Exception e)
    	 {
    		 throw new Exception("Error en Transaccion"); 
    	 }
    	 
    	 return ok;
     }
     
}
